import dayjs from 'dayjs'
import pkg from './package.json'
import {defineConfig, loadEnv} from 'vite'
import type {UserConfig, ConfigEnv} from 'vite'
import {fileURLToPath} from 'url'
import {createVitePlugin} from './build/plugins'
import {createProxy} from './build/proxy'
import {wrapperEnv} from './build/getEnv'
import {externals} from './build/plugins'
const {dependencies, devDependencies, name, version} = pkg
const __APP_INFO__ = {
  pkg: {dependencies, devDependencies, name, version},
  lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss')
}

// @see: https://vitejs.dev/config/
export default defineConfig(({mode}: ConfigEnv): UserConfig => {
  // 获取当前工作目录
  const root = process.cwd()
  // 获取环境变量
  const env = loadEnv(mode, root)
  const viteEnv = wrapperEnv(env)

  return {
    base: viteEnv.VITE_PUBLIC_PATH,
    root,
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url)),
        'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js'
      }
    },
    // 定义全局常量替换方式。其中每项在开发环境下会被定义在全局，而在构建时被静态替换
    define: {
      __APP_INFO__: JSON.stringify(__APP_INFO__)
    },
    css: {
      preprocessorOptions: {
        scss: {
          javascriptEnabled: true,
          additionalData: '@import "./src/styles/variable.scss";'
        }
      }
    },
    server: {
      host: '0.0.0.0',
      port: viteEnv.VITE_PORT,
      open: viteEnv.VITE_OPEN,
      cors: true,
      proxy: createProxy(viteEnv.VITE_PROXY)
      // proxy: {
      //   [env.VITE_API_URL]: {
      //     target: env.VITE_SERVER,
      //     changeOrigin: true,
      //     rewrite: (path) => path.replace(/^\/api/, "")
      //   },
      // }
    },
    plugins: createVitePlugin(viteEnv),
    esbuild: {
      pure: viteEnv.VITE_DROP_CONSOLE ? ['console.log', 'debugger'] : []
    },
    build: {
      outDir: 'dist',
      // 指定使用哪种混淆器
      // minify: 'esbuild',
      // esbuild 打包更快，但是不能去除 console.log，terser打包慢，但能去除 console.log
      minify: 'terser',
      terserOptions: {
        compress: {
          drop_console: viteEnv.VITE_DROP_CONSOLE,
          drop_debugger: true
        }
      },

      // 构建后是否生成 source map 文件
      sourcemap: false,
      // 禁用 gzip 压缩大小报告，可略微减少打包时间
      // reportCompressedSize: false,
      // 规定触发警告的 chunk 大小
      chunkSizeWarningLimit: 2000,
      rollupOptions: {
        input: {
          index: fileURLToPath(new URL('./index.html', import.meta.url))
        },
        external: externals,
        // 将每个文件发现的第一个副作用打印到控制台
        // experimentalLogSideEffects: true,
        output: {
          // 最小为20kb 仅当合并不会改变任何入口加载时执行的副作用时，才会执行合并
          experimentalMinChunkSize: 20480,
          manualChunks: (id: string) => {
            // 三方库分类打包  极少数页面使用
            if (id.includes('html2canvas')) {
              return 'html2canvas'
            }
            if (id.includes('node_modules')) {
              return 'vendor'
            }
            // 可以通过这种方式实现向webpack一样分路由打包
            // if (id.includes('src/views/login')) {
            //   return 'login'
            // }
            // return 'index'
          },
          // 代码分割中产生的 chunk 自定义命名规则(静态资源分类打包)
          chunkFileNames: 'assets/js/[name]-[hash].js',
          entryFileNames: 'assets/js/[name]-[hash].js',
          assetFileNames: 'assets/[ext]/[name]-[hash].[ext]'
        }
      }
    }
  }
})
